package com.ntd.study.coding.standards;

import java.util.List;

/**
 * @author liuwenju
 * @date 2021/3/20
 * 阿里规约规范学习 - 命名规范
 */
public class StudyNamingConventions {

    public StudyNamingConventions() {
    }

    /**
     * 命名风格
     */
    public void namingStyle() {
        // 1. 代码中的命名均不能以下划线或美元符号开始，也不能以下划线或美元符号结束 例：
        String _name, $name, name_, name$;
        // 2. 代码中的命名严禁使用拼音，更不允许直接使用中文的方式
        // 3. 类名使用 UpperCamelCase 风格(单词首字母大写)，但以下情形例外：DO / BO / DTO / VO / AO / PO / UID 等
        class JavaClass {
        }
        class UserDO {
        }
        // 4. 方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格，必须遵从驼峰形式
        // 5. 常量命名全部大写，单词间用下划线隔开，力求语义表达完整清楚，不要嫌名字
        final String USER_NAME;
        // 6. 抽象类命名使用 Abstract 或 Base 开头；异常类命名使用 Exception 结尾；测试类命名以它要测试的类的名称开始，以 Test 结尾
        abstract class AbstractJavaClass {
        }
        abstract class BaseJavaClass {
        }
        class BaseJavaException {
        }
        class BaseJavaTest {
        }
        // 7. 类型与中括号紧挨相连来表示数组
        int[] a; // 正确
        int b[]; // 错误
        // 8. POJO 类中布尔类型变量都不要加 is 前缀，否则部分框架解析会引起序列化错误
        boolean isEnable; // 错误
        boolean enable; // 正确
        // 9. 包名统一使用小写，点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式，但是类名如果有复数含义，类名可以使用复数形式
        // 10. 避免在子父类的成员变量之间、或者不同代码块的局部变量之间采用完全相同的命名，使可读性降低
        // 11. 杜绝完全不规范的缩写，避免望文不知义
        class AbstractClass {
        } // 正确
        class AbsClass {
        } // 错误
        // 12. 为了达到代码自解释的目标，任何自定义编程元素在命名时，使用尽量完整的单词组合来表达其意
        // 13. 在常量与变量的命名时，表示类型的名词放在词尾，以提升辨识度
        // 14. 如果模块、接口、类、方法使用了设计模式，在命名时需体现出具体模式
        class OrderFactory {
        } // 工厂模式
        class LoginProxy {
        } // 代理模式
        class ResourceObserver {
        } // 观察者
        // 15. 接口类中的方法和属性不要加任何修饰符号（public 也不要加），保持代码的简洁性，并加上有效的 Javadoc 注释。尽量不要在接口里定义变量，如果一定要定义变量，肯定是与接口方法相关，并且是整个应用的基础常量
        // 16. 接口和实现类的命名有两套规则
        // |-- (1) 对于 Service 和 DAO 类，基于 SOA 的理念，暴露出来的服务一定是接口，内部的实现类用Impl 的后缀与接口区别 CacheServiceImpl 实现 CacheService 接口
        // |-- (2) 如果是形容能力的接口名称，取对应的形容词为接口名（通常是–able 的形容词）AbstractTranslator 实现 Translatable 接口
        // 17. 枚举类名带上 Enum 后缀，枚举成员名称需要全大写，单词间用下划线隔开
    }

    // 18. 各层命名规约
    // Service/DAO 层方法命名规约
    interface JavaService {
        // 获取单个对象用 get 为前缀
        Object get();
        // 获取多个对象用 list 为前缀
        List<Object> list();
        // 获取统计值的方法用 count 为前缀
        int count();
        // 插入的方法用 save/insert 为前缀
        boolean save(Object object);
        boolean insert(Object object);
        // 删除的方法用 remove/delete 为前缀
        boolean removeById(Long id);
        boolean deleteById(Long id);
        // 修改的方法用 update 做前缀
        boolean updateById(Object object);
    }
    // 领域模型命名规约
    // 数据对象, 表明 + DO 结尾
    class ObjectDO{}
    // 数据传输对象， 业务领域相关名称 + DTO 结尾
    class ObjectDTO{}
    // 展示对象， 网页名称 + VO 结尾
    class ObjectVO{}
    // POJO 是 DO/DTO/BO/VO 的统称，禁止命名成 xxxPOJO


}
